Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / Sideband.git / files / sbapp / patches / HIDDeviceUSB.java

Displaying Raw • Download


sbapp/patches/HIDDeviceUSB.java 2.0.1 (486a97e4) Text, 9.01 KB

T8b949e// Patched HID device handling in relation to:
T8b949e// https://github.com/libsdl-org/SDL/issues/3850

Tff7b72package T7ee787org.libsdl.appTb4b4b4;

Tff7b72import T7ee787android.hardware.usb.*Tb4b4b4;
Tff7b72import T7ee787android.os.BuildTb4b4b4;
Tff7b72import T7ee787android.util.LogTb4b4b4;
Tff7b72import T7ee787java.util.ArraysTb4b4b4;

Tff7b72class T56d364HIDDeviceUSB Tff7b72implements Te6edf3HIDDevice Tb4b4b4{

Tff7b72private Tff7b72static Tff7b72final Te6edf3String Te6edf3TAG Tff7b72= Ta5d6ff"Ta5d6ffhidapiTa5d6ff"Tb4b4b4;

Tff7b72protected Te6edf3HIDDeviceManager Te6edf3mManagerTb4b4b4;
Tff7b72protected Te6edf3UsbDevice Te6edf3mDeviceTb4b4b4;
Tff7b72protected Tffa657int Te6edf3mInterfaceTb4b4b4;
Tff7b72protected Tffa657int Te6edf3mDeviceIdTb4b4b4;
Tff7b72protected Te6edf3UsbDeviceConnection Te6edf3mConnectionTb4b4b4;
Tff7b72protected Te6edf3UsbEndpoint Te6edf3mInputEndpointTb4b4b4;
Tff7b72protected Te6edf3UsbEndpoint Te6edf3mOutputEndpointTb4b4b4;
Tff7b72protected Te6edf3InputThread Te6edf3mInputThreadTb4b4b4;
Tff7b72protected Tffa657boolean Te6edf3mRunningTb4b4b4;
Tff7b72protected Tffa657boolean Te6edf3mFrozenTb4b4b4;

Tff7b72public Td2a8ffHIDDeviceUSBTb4b4b4(Te6edf3HIDDeviceManager Te6edf3managerTb4b4b4, Te6edf3UsbDevice Te6edf3usbDeviceTb4b4b4, Tffa657int Te6edf3interface_numberTb4b4b4) Tb4b4b4{
Te6edf3mManager Tff7b72= Te6edf3managerTb4b4b4;
Te6edf3mDevice Tff7b72= Te6edf3usbDeviceTb4b4b4;
Te6edf3mInterface Tff7b72= Te6edf3interface_numberTb4b4b4;
Te6edf3mDeviceId Tff7b72= Te6edf3managerTb4b4b4.Te6edf3getDeviceIDForIdentifierTb4b4b4(Te6edf3getIdentifierTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3mRunning Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}

Tff7b72public Te6edf3String Td2a8ffgetIdentifierTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(Ta5d6ff"Ta5d6ff%s/%x/%xTa5d6ff"Tb4b4b4, Te6edf3mDeviceTb4b4b4.Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3mDeviceTb4b4b4.Te6edf3getVendorIdTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3mDeviceTb4b4b4.Te6edf3getProductIdTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657int Td2a8ffgetIdTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3mDeviceIdTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657int Td2a8ffgetVendorIdTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3mDeviceTb4b4b4.Te6edf3getVendorIdTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657int Td2a8ffgetProductIdTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3mDeviceTb4b4b4.Te6edf3getProductIdTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Te6edf3String Td2a8ffgetSerialNumberTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3String Te6edf3result Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= T79c0ff21Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3result Tff7b72= Te6edf3mDeviceTb4b4b4.Te6edf3getSerialNumberTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3SecurityException Te6edf3eTb4b4b4) Tb4b4b4{

Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657int Td2a8ffgetVersionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Te6edf3String Td2a8ffgetManufacturerNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3String Te6edf3result Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= T79c0ff21Tb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Te6edf3mDeviceTb4b4b4.Te6edf3getManufacturerNameTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(Ta5d6ff"Ta5d6ff%xTa5d6ff"Tb4b4b4, Te6edf3getVendorIdTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Te6edf3String Td2a8ffgetProductNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3String Te6edf3result Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= T79c0ff21Tb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Te6edf3mDeviceTb4b4b4.Te6edf3getProductNameTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(Ta5d6ff"Ta5d6ff%xTa5d6ff"Tb4b4b4, Te6edf3getProductIdTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}

Tff7b72public Te6edf3UsbDevice Td2a8ffgetDeviceTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3mDeviceTb4b4b4;
Tb4b4b4}

Tff7b72public Te6edf3String Td2a8ffgetDeviceNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3getManufacturerNameTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+ Te6edf3getProductNameTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff(0xTa5d6ff" Tff7b72+ Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(Ta5d6ff"Ta5d6ff%xTa5d6ff"Tb4b4b4, Te6edf3getVendorIdTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff/0xTa5d6ff" Tff7b72+ Te6edf3StringTb4b4b4.Te6edf3formatTb4b4b4(Ta5d6ff"Ta5d6ff%xTa5d6ff"Tb4b4b4, Te6edf3getProductIdTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff)Ta5d6ff"Tb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657boolean Td2a8ffopenTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3mConnection Tff7b72= Te6edf3mManagerTb4b4b4.Te6edf3getUSBManagerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3openDeviceTb4b4b4(Te6edf3mDeviceTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3mConnection Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3wTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffUnable to open USB device Ta5d6ff" Tff7b72+ Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}

T8b949e// Force claim all interfaces
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3mDeviceTb4b4b4.Te6edf3getInterfaceCountTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3UsbInterface Te6edf3iface Tff7b72= Te6edf3mDeviceTb4b4b4.Te6edf3getInterfaceTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3mConnectionTb4b4b4.Te6edf3claimInterfaceTb4b4b4(Te6edf3ifaceTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3wTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffFailed to claim interfaces on USB device Ta5d6ff" Tff7b72+ Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Find the endpoints
Te6edf3UsbInterface Te6edf3iface Tff7b72= Te6edf3mDeviceTb4b4b4.Te6edf3getInterfaceTb4b4b4(Te6edf3mInterfaceTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3ifaceTb4b4b4.Te6edf3getEndpointCountTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3jTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3UsbEndpoint Te6edf3endpt Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3getEndpointTb4b4b4(Te6edf3jTb4b4b4)Tb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3endptTb4b4b4.Te6edf3getDirectionTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72case Te6edf3UsbConstantsTb4b4b4.Te6edf3USB_DIR_INTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3mInputEndpoint Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3mInputEndpoint Tff7b72= Te6edf3endptTb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tff7b72case Te6edf3UsbConstantsTb4b4b4.Te6edf3USB_DIR_OUTTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3mOutputEndpoint Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3mOutputEndpoint Tff7b72= Te6edf3endptTb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Make sure the required endpoints were present
Tff7b72if Tb4b4b4(Te6edf3mInputEndpoint Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3mOutputEndpoint Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3wTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffMissing required endpoint on USB device Ta5d6ff" Tff7b72+ Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}

T8b949e// Start listening for input
Te6edf3mRunning Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3mInputThread Tff7b72= Tff7b72new Te6edf3InputThreadTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3mInputThreadTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657int Td2a8ffsendFeatureReportTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3reportTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3res Tff7b72= Tff7b72-T79c0ff1Tb4b4b4;
Tffa657int Te6edf3offset Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3length Tff7b72= Te6edf3reportTb4b4b4.Te6edf3lengthTb4b4b4;
Tffa657boolean Te6edf3skipped_report_id Tff7b72= Tff7b72falseTb4b4b4;
Tffa657byte Te6edf3report_number Tff7b72= Te6edf3reportTff7b72[T79c0ff0Tff7b72]Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3report_number Tff7b72=Tff7b72= T79c0ff0x0Tb4b4b4) Tb4b4b4{
Tff7b72+Tff7b72+Te6edf3offsetTb4b4b4;
Tff7b72-Tff7b72-Te6edf3lengthTb4b4b4;
Te6edf3skipped_report_id Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}

Te6edf3res Tff7b72= Te6edf3mConnectionTb4b4b4.Te6edf3controlTransferTb4b4b4(
Te6edf3UsbConstantsTb4b4b4.Te6edf3USB_TYPE_CLASS Tff7b72| T79c0ff0x01 T8b949e/*RECIPIENT_INTERFACE*/ Tff7b72| Te6edf3UsbConstantsTb4b4b4.Te6edf3USB_DIR_OUTTb4b4b4,
T79c0ff0x09T8b949e/*HID set_report*/Tb4b4b4,
Tb4b4b4(T79c0ff3T8b949e/*HID feature*/ Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3report_numberTb4b4b4,
T79c0ff0Tb4b4b4,
Te6edf3reportTb4b4b4, Te6edf3offsetTb4b4b4, Te6edf3lengthTb4b4b4,
T79c0ff1000T8b949e/*timeout millis*/Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3res Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3wTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffsendFeatureReport() returned Ta5d6ff" Tff7b72+ Te6edf3res Tff7b72+ Ta5d6ff"Ta5d6ff on device Ta5d6ff" Tff7b72+ Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72-T79c0ff1Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3skipped_report_idTb4b4b4) Tb4b4b4{
Tff7b72+Tff7b72+Te6edf3lengthTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3lengthTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657int Td2a8ffsendOutputReportTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3reportTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3r Tff7b72= Te6edf3mConnectionTb4b4b4.Te6edf3bulkTransferTb4b4b4(Te6edf3mOutputEndpointTb4b4b4, Te6edf3reportTb4b4b4, Te6edf3reportTb4b4b4.Te6edf3lengthTb4b4b4, T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72!Tff7b72= Te6edf3reportTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3wTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffsendOutputReport() returned Ta5d6ff" Tff7b72+ Te6edf3r Tff7b72+ Ta5d6ff"Ta5d6ff on device Ta5d6ff" Tff7b72+ Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3rTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657boolean Td2a8ffgetFeatureReportTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3reportTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3res Tff7b72= Tff7b72-T79c0ff1Tb4b4b4;
Tffa657int Te6edf3offset Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3length Tff7b72= Te6edf3reportTb4b4b4.Te6edf3lengthTb4b4b4;
Tffa657boolean Te6edf3skipped_report_id Tff7b72= Tff7b72falseTb4b4b4;
Tffa657byte Te6edf3report_number Tff7b72= Te6edf3reportTff7b72[T79c0ff0Tff7b72]Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3report_number Tff7b72=Tff7b72= T79c0ff0x0Tb4b4b4) Tb4b4b4{
T8b949e/* Offset the return buffer by 1, so that the report ID
will remain in byte 0. */
Tff7b72+Tff7b72+Te6edf3offsetTb4b4b4;
Tff7b72-Tff7b72-Te6edf3lengthTb4b4b4;
Te6edf3skipped_report_id Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}

Te6edf3res Tff7b72= Te6edf3mConnectionTb4b4b4.Te6edf3controlTransferTb4b4b4(
Te6edf3UsbConstantsTb4b4b4.Te6edf3USB_TYPE_CLASS Tff7b72| T79c0ff0x01 T8b949e/*RECIPIENT_INTERFACE*/ Tff7b72| Te6edf3UsbConstantsTb4b4b4.Te6edf3USB_DIR_INTb4b4b4,
T79c0ff0x01T8b949e/*HID get_report*/Tb4b4b4,
Tb4b4b4(T79c0ff3T8b949e/*HID feature*/ Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3report_numberTb4b4b4,
T79c0ff0Tb4b4b4,
Te6edf3reportTb4b4b4, Te6edf3offsetTb4b4b4, Te6edf3lengthTb4b4b4,
T79c0ff1000T8b949e/*timeout millis*/Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3res Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3wTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffgetFeatureReport() returned Ta5d6ff" Tff7b72+ Te6edf3res Tff7b72+ Ta5d6ff"Ta5d6ff on device Ta5d6ff" Tff7b72+ Te6edf3getDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3skipped_report_idTb4b4b4) Tb4b4b4{
Tff7b72+Tff7b72+Te6edf3resTb4b4b4;
Tff7b72+Tff7b72+Te6edf3lengthTb4b4b4;
Tb4b4b4}

Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3res Tff7b72=Tff7b72= Te6edf3lengthTb4b4b4) Tb4b4b4{
Te6edf3data Tff7b72= Te6edf3reportTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3data Tff7b72= Te6edf3ArraysTb4b4b4.Te6edf3copyOfRangeTb4b4b4(Te6edf3reportTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3resTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3mManagerTb4b4b4.Te6edf3HIDDeviceFeatureReportTb4b4b4(Te6edf3mDeviceIdTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4;

Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffcloseTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3mRunning Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3mInputThread Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(Te6edf3mInputThreadTb4b4b4.Te6edf3isAliveTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3mInputThreadTb4b4b4.Te6edf3interruptTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3mInputThreadTb4b4b4.Te6edf3joinTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3InterruptedException Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e// Keep trying until we're done
Tb4b4b4}
Tb4b4b4}
Te6edf3mInputThread Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3mConnection Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3mDeviceTb4b4b4.Te6edf3getInterfaceCountTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3UsbInterface Te6edf3iface Tff7b72= Te6edf3mDeviceTb4b4b4.Te6edf3getInterfaceTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Te6edf3mConnectionTb4b4b4.Te6edf3releaseInterfaceTb4b4b4(Te6edf3ifaceTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3mConnectionTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3mConnection Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffshutdownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3mManager Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}

Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffsetFrozenTb4b4b4(Tffa657boolean Te6edf3frozenTb4b4b4) Tb4b4b4{
Te6edf3mFrozen Tff7b72= Te6edf3frozenTb4b4b4;
Tb4b4b4}

Tff7b72protected Tff7b72class T56d364InputThread Tff7b72extends Te6edf3Thread Tb4b4b4{
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffrunTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3packetSize Tff7b72= Te6edf3mInputEndpointTb4b4b4.Te6edf3getMaxPacketSizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657byteTff7b72[Tff7b72] Te6edf3packet Tff7b72= Tff7b72new Tffa657byteTff7b72[Te6edf3packetSizeTff7b72]Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3mRunningTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3rTb4b4b4;
Tff7b72try
Tb4b4b4{
Te6edf3r Tff7b72= Te6edf3mConnectionTb4b4b4.Te6edf3bulkTransferTb4b4b4(Te6edf3mInputEndpointTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3packetSizeTb4b4b4, T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4)
Tb4b4b4{
Te6edf3LogTb4b4b4.Te6edf3vTb4b4b4(Te6edf3TAGTb4b4b4, Ta5d6ff"Ta5d6ffException in UsbDeviceConnection bulktransfer: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// Could be a timeout or an I/O error
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3dataTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72=Tff7b72= Te6edf3packetSizeTb4b4b4) Tb4b4b4{
Te6edf3data Tff7b72= Te6edf3packetTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3data Tff7b72= Te6edf3ArraysTb4b4b4.Te6edf3copyOfRangeTb4b4b4(Te6edf3packetTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3rTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3mFrozenTb4b4b4) Tb4b4b4{
Te6edf3mManagerTb4b4b4.Te6edf3HIDDeviceInputReportTb4b4b4(Te6edf3mDeviceIdTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────